#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<set>
using namespace std;
struct ListNode {
    int val;
    ListNode* next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode* next) : val(x), next(next) {}
};
class Solution {
public:
    //ListNode* deleteDuplicates(ListNode* head) {
    //    ListNode* pcur = head;
    //    set<int> s;
    //    while (pcur)
    //    {
    //        s.insert(pcur->val);
    //        pcur = pcur->next;
    //    }
    //    set<int>::iterator it = s.begin();
    //    ListNode* newhead = new ListNode(*it);
    //    ++it;
    //    while (it != s.end())
    //    {
    //        ListNode* temp = new ListNode(*it);
    //        ++it;
    //    }
    //    return newhead;
    //}



    ListNode* deleteDuplicates(ListNode* head) {
        ListNode* pcur = head;
        set<int> s;
        while (pcur)
        {
            s.insert(pcur->val);
            pcur = pcur->next;
        }
        set<int>::iterator it = s.begin();
        ListNode* pc = new ListNode;
        ListNode* NewHead = pc;
        while (it != s.end())
        {
            ListNode* temp = new ListNode(*it);
            pc->next = temp;
            pc = temp;
            ++it;
        }
        return NewHead->next;
    }
};
int main()
{
    Solution s;
    ListNode* head = new ListNode(1);
    ListNode* p1 = new ListNode(2);
    ListNode* p2 = new ListNode(2);
    ListNode* p3 = new ListNode(4);
    head->next = p1;
    p1->next = p2;
    p2->next = p3;
    p3->next = nullptr;
    s.deleteDuplicates(head);
    return 0;
}